package com.example.sentinel;

import com.alibaba.csp.sentinel.AsyncEntry;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;

public class Main {
    public static void main(String[] args) {
        // 1.5.0 版本开始可以利用 try-with-resources 特性
        // 资源名可使用任意有业务语义的字符串，比如方法名、接口名或其它可唯一标识的字符串。
        try (Entry entry = SphU.entry("resource1")) {
            // 被保护的业务逻辑
            // do something here...
        } catch (BlockException ex) {
            // 资源访问阻止，被限流或被降级
            // 在此处进行相应的处理操作
        }


        try {
            AsyncEntry entry = SphU.asyncEntry("resource1");

            // 异步调用.
            //doAsync(userId, result -> {
            //    try {
                    // 在此处处理异步调用的结果.
            //    } finally {
                    // 在回调结束后 exit.
            //        entry.exit();
            //    }
            //});
        } catch (BlockException ex) {
            // Request blocked.
            // Handle the exception (e.g. retry or fallback).
        }
    }

    @SentinelResource
    public void resource1() {

    }
}
